<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>new关键字</title>
</head>
<body>
  <script>
   /*
   * 在调用new的过程中做了四件事：
   1.新生成对象
   2.链接到原型
   3.绑定this
   4.返回新对象
   */

   // 实现类型new的方法
   // 定义create方法
   function create() {
     //1.定义空对象
     let obj = {};
     // 取出参数列表的第一个参数(构造函数)
     let Con = [].shift.call(arguments);
     // 手动指正obj的构造函数为Con(链接原型)
     obj._proto_ = Con.prototype;
     // 调用Con,改变this为obj，传入剩余参数arguments
     let result = Con.apply(obj, arguments);
     // 考虑到Con函数中有return 的原因，需要对result进行判断
     return result instanceof Object ? result : obj
   }
   // 现在便可以通过create(构造函数, 参数)来创建对象
   // 关于[].shift.call(arguments)
   // 因为arguments是类数组对象，虽然有length属性，但是没有shift方法，故通过call方法改变执行上下文调用shift方法
  </script>
</body>
</html>